<!DOCTYPE html>
<html lang="zh-CH" >
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="" />
	
	
	
	<title>井字棋小游戏 ｜ zansimple</title>
	
    
    
    <meta name="description" content="前言 最近正在看《C#6.0本质论》为了更清楚的了解书中的内容，特地花了一天的时间通过在 Unity 中实现这个游戏来总结一下 1~3 章的内容。
正文 本文这要的思路是通过位操作来实现，记录两个玩家每一步的位置。当然算法不止一种，主要是基于《C#6.0本质论》里讲到的内容做一个总结
思路  通过位操作（position = 1 &amp;laquo; position ）来获取当前玩家选中的位置 positionX(or positionO) |= position 来记录该玩家所有选中的位置 根据所有的可能性来判断是否成功 （target &amp;amp; positionX(or positionO) == target) (target 为目标位置 如：111 000 000、 000 111 000 、 000 000 111 &amp;hellip;)  核心算法   位置选择
 public void OnButtonClick(){if (isSelect){GameView.instance.ShowTips(&amp;quot;已被选...&amp;quot;);return;}isSelect = true;//标记此位置已被选中GameManager.instance.SetPostion(playerPos);//记录选中位置//贴图image.material = GameView.instance.GetMaterial(GameManager.instance.player);//判断游戏是否结束if (GameManager.instance.GameOver(playerPos)){GameView.instance.ShowTipsAllTimes(&amp;quot;游戏结束\n恭喜 &amp;quot; &#43; GameManager." />
    

    

	
    
    <link rel="shortcut icon" href="https://lenzan.github.io/images/favicon.ico" />

    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/normalize.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/zozo.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/highlight.css" />

    
    
</head>

<body>
    <div class="main animate__animated animate__fadeInDown">
        <div class="nav_container animated fadeInDown">
    <div class="site_nav" id="site_nav">
        <ul>
            
            <li>
                <a href="/">首页</a>
            </li>
            
            <li>
                <a href="/">unity</a>
            </li>
            
            <li>
                <a href="/">归档</a>
            </li>
            
            <li>
                <a href="/">关于</a>
            </li>
            
        </ul>
    </div>
    <div class="menu_icon">
        <a id="menu_icon"><i class="ri-menu-line"></i></a>
    </div>
</div>
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <h1>
                <a href="https://lenzan.github.io/">
                    <span>zansimple</span>
                    <img src="https://lenzan.github.io/images/logo.svg" />
                </a>
            </h1>
        </div>
        <div class="description">
            <p class="sub_title">专注于Unity虚拟现实开发，游戏开发</p>
            <div class="my_socials">
                
                <a href="https://lenzan.github.io/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
                        class="ri-rss-fill"></i></a>
            </div>
        </div>
    </div>
</div>
        <div class="content">
            <div class="post_page">
                <div class="post animate__animated animate__fadeInDown">
                    <div class="post_title post_detail_title">
                        <h2><a href='/posts/Unity/Tic_Tac_Toe/'>井字棋小游戏</a></h2>
                        <span class="date">2018.07.02</span>
                    </div>
                    <div class="post_content markdown"><h2 id="前言">前言</h2>
<p>最近正在看《C#6.0本质论》为了更清楚的了解书中的内容，特地花了一天的时间通过在 Unity 中实现这个游戏来总结一下 1~3 章的内容。</p>
<h2 id="正文">正文</h2>
<p>本文这要的思路是通过位操作来实现，记录两个玩家每一步的位置。当然算法不止一种，主要是基于《C#6.0本质论》里讲到的内容做一个总结</p>
<h2 id="思路">思路</h2>
<ul>
<li>通过位操作（position = 1 &laquo; position ）来获取当前玩家选中的位置</li>
<li>positionX(or positionO) |= position 来记录该玩家所有选中的位置</li>
<li>根据所有的可能性来判断是否成功 （target &amp; positionX(or positionO) == target) (target 为目标位置 如：111 000 000、 000 111 000 、 000 000 111 &hellip;)</li>
</ul>
<h2 id="核心算法">核心算法</h2>
<ul>
<li>
<p>位置选择</p>
<pre><code>  public void OnButtonClick()
  {
      if (isSelect)
      {
          GameView.instance.ShowTips(&quot;已被选...&quot;);
          return;
      }

      isSelect = true;//标记此位置已被选中

      GameManager.instance.SetPostion(playerPos);//记录选中位置

      //贴图
      image.material = GameView.instance.GetMaterial(GameManager.instance.player);

      //判断游戏是否结束
      if (GameManager.instance.GameOver(playerPos))
      {
          GameView.instance.ShowTipsAllTimes(&quot;游戏结束\n恭喜 &quot; + GameManager.instance.player.ToString() +&quot; 获胜！！！&quot;);
          return;
      }

      //更换玩家
      GameManager.instance.player = (GameManager.instance.player == Player.O)
          ? GameManager.instance.player = Player.X
          : Player.O;

      GameView.instance.SetPlayer(GameManager.instance.player);
  }
</code></pre>
</li>
<li>
<p>记录玩家已选择的位置</p>
<pre><code>  private int postionX; //记录 X 玩家已选择的位置
  private int postionO; //记录 O 玩家已选择的位置
  public void SetPostion( int _position)
  {
      //每次玩家选择的位置
      int position = 1 &lt;&lt; _position;

      //判断是哪个玩家选择了该位置
      if (player == Player.O)
      {
          //通过 |= 操作来记录玩家所有选择的位置 （0 为未选择 ， 1 位已选择）
          postionO |= position;
      }
      else
      {
          postionX |= position;
      }
  }
</code></pre>
</li>
<li>
<p>判断游戏结束</p>
<pre><code>  //成功的所有可能性
  int[] winningMasks = {7, 56 , 448 , 73 , 146 , 292 , 84 , 273}
  public bool GameOver(int _playerPos)
  {
      foreach (int mask in winningMasks)
      {
          if ((mask &amp; postionX) == mask)// X 玩家获胜
          {
              isOver = true;
              break;
          }
          else if ((mask &amp; postionO) == mask)// O 玩家获胜
          {
              isOver = true;
              break;
          }
      }
      //平局
      if (!GameView.instance.items.Any(item =&gt; item.IsSelect == false))
      {
          isOver = false;
          GameView.instance.ShowTipsAllTimes(&quot;平局&quot;);
      }

      return isOver;
  }
</code></pre>
</li>
</ul>
<p>其实通过位操作实现起来还蛮简单的，当然这只是简单的 3*3 的图。 后面如果有时间的话我会加上 AI 自动下棋功能。可能会用到数据结构中的图。正好我也在学习书籍结构&hellip;</p>
<h2 id="工程及源代码">工程及源代码</h2>
<p><a href="https://github.com/Lenzan/Tic_Tac_Toe">Project</a></p>
<h2 id="配图">配图</h2>
<p><img src="/img/tic_tac_toe/3.jpg" alt="图片"></p>
</div>
                    <div class="post_footer">
                        
                        <div class="meta">
                            <div class="info">
                                <span class="field tags">
                                    <i class="ri-stack-line"></i>
                                    
                                    <a href="https://lenzan.github.io/tags/%E4%BA%95%E5%AD%97%E6%A3%8B/">井字棋</a>
                                    
                                    <a href="https://lenzan.github.io/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/">小游戏</a>
                                    
                                </span>
                            </div>
                        </div>
                        
                    </div>
                </div>
                
                
            </div>
        </div>
    </div>
    <a id="back_to_top" href="#" class="back_to_top"><span>△</span></a>
    <footer class="footer">
    <div class="powered_by">
        <a href="https://varkai.com">Designed by VarKai,</a>
        <a href="http://www.gohugo.io/">Proudly published with Hugo</a>
    </div>

    <div class="footer_slogan">
        <span></span>
    </div>
</footer>
    <script src="https://lenzan.github.io/js/jquery-3.5.1.min.js"></script>
<link href="https://lenzan.github.io/css/fancybox.min.css" rel="stylesheet">
<script src="https://lenzan.github.io/js/fancybox.min.js"></script>
<script src="https://lenzan.github.io/js/zozo.js"></script>






</body>

</html>